package front_article_api

import (
	"blog_go/global"
	"blog_go/models"
	"blog_go/models/ctype"
	"blog_go/models/res"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"time"
)

type ArticleSearchReq struct {
	Tag   string `json:"tag" form:"tag"`
	Title string `json:"title" form:"title"`
	Page  int    `json:"page" form:"page"`
	Size  int    `json:"size" form:"size"`
}

type ArticleSearchRsp struct {
	ID            uint      `json:"id"`             // 主键id
	CreatedAt     time.Time `json:"created_at"`     // 创建时间
	Title         string    `json:"title"`          // 文章标题
	Abstract      string    `json:"abstract"`       // 文章简介
	LookCount     uint      `json:"look_count"`     // 浏览量
	CommentCount  uint      `json:"comment_count"`  // 评论量
	DiggCount     uint      `json:"digg_count"`     // 点赞量
	CollectsCount uint      `json:"collects_count"` // 收藏量
	Category      string    `json:"category"`       // 文章分类
	Source        string    `json:"source"`         // 文章来源
	Link          string    `json:"link"`           // 原文链接
	ImageID       uint      `json:"image_id"`       // 文章封面id
	// 冗余字段
	Tags      ctype.Array `json:"tags"`       // 文章标签
	UserID    uint        `json:"user_id"`    // 用户id
	NickName  string      `json:"nick_name"`  // 发布文章的用户昵称
	ImagePath string      `json:"image_path"` // 文章的封面
}

func (ArticleApi) ArticleSearch(c *gin.Context) {
	req := ArticleSearchReq{
		Page: 1,
		Size: 10,
	}
	offset := (req.Page - 1) * req.Size
	if err := c.ShouldBindQuery(&req); err != nil {
		logrus.Error(err)
		panic(err)
	}
	if req.Tag != "" {
		var tagModel models.TagModel
		err := global.DB.Where("title = ?", req.Tag).First(tagModel).Error
		if err != nil {
			logrus.Error(err)
			panic(err)
		}
		// 查询总数
		var count int64
		global.DB.Model(&models.Article2TagModel{}).Where("tag_id = ?", req.Tag).Count(&count)
		// 查询文章关联表
		var article2TagList []models.Article2TagModel
		var articleIdList []uint
		err = global.DB.Where("tag_id = ?", tagModel.ID).Offset(offset).Limit(req.Size).Find(&article2TagList).Select("article_id").Scan(&articleIdList).Error
		if err != nil {
			logrus.Error(err)
			panic(err)
		}
		// 查询文章
		var rsp []ArticleSearchRsp
		tx := global.DB.Model(&models.ArticleModel{}).Find(&rsp, articleIdList)
		if tx.Error != nil {
			logrus.Error(tx.Error)
			panic(tx.Error)
		}
		res.OkWithList(rsp, count, c)
	}
	// 查询总数
	var count int64
	global.DB.Model(&models.ArticleModel{}).Where("title like ?", "%"+req.Title+"%").Count(&count)
	// 查询文章
	var rsp []ArticleSearchRsp
	global.DB.Model(&models.ArticleModel{}).Where("title like ?", "%"+req.Title+"%").Offset(offset).Limit(req.Size).Find(&rsp)
	res.OkWithList(rsp, count, c)
}
